knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE)

library(tidyverse)
library(here)
library(sf)
library(tmap)

### update.packages(ask = FALSE)

cmd-shift-enter shortcut for running the current code chunk

Read in the data

cmd-option-i shortcut for creating a code chunk

sf_trees <- read_csv(here('data','sf_trees','sf_trees.csv'), 
                     show_col_types = FALSE)

Part 1: Wrangling and ggplot review

Example 1: Find counts of observation by legal_status & wrangle a bit.

### Method 1: group_by %>% summarize()
sf_trees %>% 
  group_by(legal_status) %>% #group by the legal status
  summarize(tree_count = n()) # for each legal status, count the number of trees will be the number of rows in the data frame
## # A tibble: 10 × 2
##    legal_status                 tree_count
##    <chr>                             <int>
##  1 DPW Maintained                   141725
##  2 Landmark tree                        42
##  3 Permitted Site                    39732
##  4 Planning Code 138.1 required        971
##  5 Private                             163
##  6 Property Tree                       316
##  7 Section 143                         230
##  8 Significant Tree                   1648
##  9 Undocumented                       8106
## 10 <NA>                                 54
### Method 2: Different way plus a few new functions
top_5_status <- sf_trees %>% 
  count(legal_status) %>% #group by legal status
  drop_na(legal_status) %>% #get rid of na values within legal status
  rename(tree_count = n) %>% 
  relocate(tree_count) %>% #relocate columns
  slice_max(tree_count, n = 5) %>% 
  arrange(desc(tree_count)) #automatically orders tree count in ascending, but if you want it to be negative put a negative sign in front or use desc

Make a graph of the top 5 from above:

ggplot(data = top_5_status, aes(x = fct_reorder(legal_status,tree_count), y = tree_count)) + #use fct_reoder to reorder legal status by tree count
  geom_col(fill = 'darkgreen')+
  labs(x = 'Legal Status', y = 'Tree Count') +
  coord_flip() +#rotate the columns to be sideways
  theme_minimal()

Example 2: Only going to keep observation s where legal status is “Permitted Site” and caretaker is “MTA” , and store as permitted_data_df

shift-cmd-c to comment/uncomment quickly

# sf_trees$legal_status %>% unique() #get rid of duplicate values
# unique(sf_trees$caretaker)
permitted_data_df <- sf_trees %>% 
  filter(legal_status =="Permitted Site" & caretaker =="MTA") #both of these conditions have to be met using a comma or ampersand

#or we use filter(legal_status %in% c("Permitted Site", "Private") & caretaker %in%"MTA") for multiple results

Example 3: Only keep Blackwood Acacia trees, and then only keep columns legal_status, date, latitude, longitude and store as blackwood_acacia_df

blackwood_acacia_df <- sf_trees %>% 
  filter(str_detect(species, 'Blackwood Acacia')) %>% 
  select(legal_status, date, lat = latitude, lon = longitude)

### Make a little graph of locations
ggplot(data = blackwood_acacia_df, aes(x = lon, y = lat)) + 
  geom_point(color = 'darkgreen')

Example 4: use tidyr::separate()

sf_trees_sep <- sf_trees %>% 
  separate(species, into = c('spp_scientific','spp_common'), sep = ' :: ')

Example 5: use tidyr::unite()

ex_5 <- sf_trees %>% 
  unite('id_status',tree_id, legal_status, sep = '_COOL_')

Part 2: make some maps

Step1: convert the lat/lon to spatial point, st_as_sf() takes spatial coordinates and converts to sf object

blackwood_acacia_sf <- blackwood_acacia_df %>% 
  drop_na(lat, lon) %>% 
  st_as_sf (coords = c('lon','lat'))

### we need to tell R what the coordinate reference system is
st_crs(blackwood_acacia_sf) <- 4326

ggplot(data = blackwood_acacia_sf)+
geom_sf(color = 'darkgreen') +
  theme_minimal()

Read in the SF shapefile and add to map

sf_map <- read_sf(here('data','sf_map','tl_2017_06075_roads.shp'))

sf_map_transform <- st_transform(sf_map, 4326)

ggplot(data = sf_map_transform) +
  geom_sf()

Combine the maps!

ggplot() +
  geom_sf(data = sf_map,
          size = .1,
          color = 'darkgrey') + #add in another layer
  geom_sf(data = blackwood_acacia_sf,
          color = 'red',
          size = 0.5) +
  theme_void() +
  labs(title = "Blackwood acacias in SF")

Now an interactive map!

tmap_mode('view')

tm_shape(blackwood_acacia_sf) + #  equal to ggplot
  tm_dots() #equal to geom_point